// 函数
/* function foo() { }
let fun = function () { } */

function foo(x: string, y: number): string {
    return x + y
}
foo('aa', 456);

let fun = function (x: string, y: number): string {
    return x + y
}
console.log(fun('55', 555));

// 在ts当中的完整的写法
// 在函数当中规定数据类型，主要规定的是形参的数据类型和返回值的数据类型
let boo: (x: string, y: number) => string = function (x: string, y: number): string {
    return x + y;
}
console.log(boo('145', 456));

// 函数的参数问题
// 参数可能有默认值（形参默认值）  这个参数可有可无  有可能说我的函数的参数将来有很多，具体有多少个我也不知道
function boo1(x: string, y: string, z?: string): string {
    return x + y + z
}

console.log(boo1('a', 'b'))//abundefined
console.log(boo1('a', 'b', 'c'));//abc
// 形参后面加?：是该参数可传可不传，传入 就是该值，不传就会默认传入undefined


// ts当中使用形参默认值，意思该参数可传入可不传入，传入使用传入的新值，不传入也不会报错，使用形参默认值
function boo2(x: string, y: string = 'zheshu'): string {
    console.log(y);
    return x + y
}
console.log(boo2('1'));

// 
function boo3(x: string, y: string, ...args: string[]): string {
    console.log(args);
    return x + y;
}

console.log(boo3('1', '2'));
console.log(boo3('1', '2', '3', '4'));


// 函数中的数据类型如何使用接口来规定


// 函数调用签名
interface Fun {
    // 接口可以描述函数的数据类型（参数的数据类型和返回值的数据类型）
    (x: string, y: string): string
}
let yangyang: Fun = function (x: string, y: string): string {
    return x + y;
}
console.log(yangyang('a', 'b'));

let sizhe: Fun = function (a: string, b: string): string {
    return a + b;
}
console.log(sizhe('12', '34'));

export {
    foo,
}